package gestorvideoclub.jdbc;

//import com.mysql.jdbc.PreparedStatement;
import gestorvideoclub.jdbc.AccesoDatos;
import gestorvideoclub.Administrador;
import gestorvideoclub.Cliente;
import gestorvideoclub.Jefe;
import gestorvideoclub.Cliente;
import gestorvideoclub.enumeraciones.Rol;
import gestorvideoclub.Usuario;
import gestorvideoclub.enumeraciones.EstadoUsuario;
import gestorvideoclub.util.UtilFecha;
import java.sql.*;
import java.util.ArrayList;
//import java.util.*;

/**
 * Esta clase está diseñada para hacer operaciones con la base de datos referentes a
 * los usuarios del sistema
 */
public class UsuarioJDBC {

    /**
     *
     * @param cliente: usuario del que queremos conocer su id
     * @return Obtiene el id usuario asignado en la base de datos
     */
    public static int obtenerIdCliente(Usuario usuario) {

        String sql = "Select * from usuarios where  usuarios.dni = '" + usuario.getDNI() + "' ";

        int idUsuario = -1;
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            con = AccesoDatos.getConexion();
            stmt = con.prepareStatement(sql);
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                idUsuario = rs.getInt("Id");
            }
            rs.close();
            stmt.close();
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al obtener al usuario. " + e.getMessage());
        }

        return idUsuario;
    }

    /**
     * Inserta un nuevo usuario en la BBDD
     * 
     * @param usuario
     */
    public static void insertarUsuario(Usuario usuario) {

        String sql = "insert into usuarios (nombre, apellidos, dni, contrasenya, fechaAlta, fechaBaja, telefono, ";
        sql += " estadoUsuario, id_franquicia, tipoUsuario) values";
        sql += "('" + usuario.getNombre() + "', '" + usuario.getApellidos() + "', '" + usuario.getDNI() + "', '" + usuario.getContrasenya() + "',";
        sql += "'" + UtilFecha.fechaMySQL(usuario.getFechaAlta()) + "','" + UtilFecha.fechaMySQL(new Date(0)) + "','" + usuario.getTelefono() + "', ";
        sql += "'" + usuario.getEstadoUsuario() + "', " + 1 + ", '" + usuario.getRol() + "')";

        //System.out.println(sql);
        Connection con = null;
        Statement st = null;

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            System.out.println("[i] El usuario se ha dado de alta correctamente.");
        } catch (Exception e) {
            System.out.println("[!] Error al insertar un nuevo usuario. " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
    }

    public static boolean existeUsuarioRol(String dni, Rol rol) {
        boolean existe = false;
        String sql = "select Id from usuarios where dni='" + dni + "' and tipoUsuario = '" + rol + "'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si existe el usuario. " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return existe;
    }

    /**
     * Comprueba la existencia de un usuario en la BBDD
     * 
     * @author MIGUEL_MAESTRE
     * @param dni
     * @return Devuelve true si ha sido encontrado o false en caso contrario
     */
    public static boolean existeUsuario(String dni) {
        // TODO MIGUEL Evitar esta sobrecarga
        boolean existe = false;
        String sql = "select Id from usuarios where dni='" + dni + "'";
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si el usuario existe. " + e.getMessage());
        } finally {
            AccesoDatos.cerrarConexion(con);
        }
        return existe;
    }

    /**
     * Comprueba si un usuario está disponible: si existe y ni está de baja ni está bloqueado
     *
     * @author MIGUEL_MAESTRE
     * @param dni
     * @return Devuelve true si el usuario está disponible o false en caso contrario
     */
    public static boolean usuarioDisponible(String dni) {
        boolean disponible = false;
        Usuario usuario = new Usuario();

        if (UsuarioJDBC.existeUsuario(dni)) {
            usuario = UsuarioJDBC.obtenerUsuarioPorDni(dni);
            if (usuario.getEstadoUsuario() == EstadoUsuario.Alta) {
                disponible = true;
            }
        }

        return disponible;
    }

    public static Usuario obtenerUsuarioPorDni(String dni) {
        // TODO MIGUEL Porqué no devuelve un Usuario tipo Cliente ?
        Usuario usu = null;
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        String sql = "select * from usuarios where usuarios.dni='" + dni + "'";

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if (rs.next()) {
                String rol = rs.getString("tipoUsuario");

                if (rol.equals("Administrador")) {
                    usu = new Administrador();
                    usu.setRol(Rol.Administrador);
                } else if (rol.equals("Jefe")) {
                    usu = new Jefe();
                    usu.setRol(Rol.Jefe);
                } else if (rol.equals("Cliente")) {
                    usu = new Cliente();
                    usu.setRol(Rol.Cliente);
                }
                else{
                    usu = new Cliente();
                    usu.setRol(Rol.Cliente);
                }
                usu.setId(rs.getInt("Id"));
                usu.setNombre(rs.getString("nombre"));
                usu.setApellidos(rs.getString("apellidos"));
                usu.setDNI(rs.getString("dni"));
                usu.setContrasenya(rs.getString("contrasenya"));
                String d = rs.getString("fechaAlta");
                usu.setFechaAlta(UtilFecha.obtenerFechaBD(d));
                d = rs.getString("fechaBaja");
                usu.setFechaBaja(UtilFecha.obtenerFechaBD(d));
                usu.setTelefono(rs.getString("telefono"));
                usu.setEstadoUsuario(EstadoUsuario.valueOf(rs.getString("estadoUsuario")));
            }
            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("[!] Error al obtener el usuario. " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
        return usu;
    }

    /**
     * 
     * @param dni
     */
    public static void bloquearUsuario(String dni) {

        Connection con = null;
        Statement st = null;

        int numRegMod = 0;
        String sql = "update usuarios set estadoUsuario='Bloqueado' WHERE dni='" + dni + "'";

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            numRegMod = st.executeUpdate(sql);

            System.out.println(">>> La cuenta de usuario ha sido bloqueada.");

            st.close();

        } catch (Exception e) {
            System.out.println("[!] Error al bloquear el usuario. " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
    }

    public static void desbloquearUsuario(String dni) {

        Connection con = null;
        Statement st = null;

        int numRegMod = 0;
        String sql = "update usuarios set estadoUsuario='Alta' WHERE dni='" + dni + "'";

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            numRegMod = st.executeUpdate(sql);

            System.out.println("[i] La cuenta de usuario ha sido desbloqueada.");

            st.close();

        } catch (Exception e) {
            System.out.println("[!] Error al desbloquear el usuario. " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
    }

    public static void altaUsuario(String dni) {
        // TODO MIGUEL ¿Como desbloqueaUsuario?
        Connection con = null;
        Statement st = null;

        int numRegMod = 0;
        String sql = "update usuarios set estadoUsuario='Alta' WHERE dni='" + dni + "'";

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            numRegMod = st.executeUpdate(sql);

            System.out.println(">>> El usuario ahora está de alta.");

            st.close();

        } catch (Exception e) {
            System.out.println("Error al desbloquear el usuario. " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
    }

    public static void bajaUsuario(String dni) {
        // TODO MIGUEL ¿Como desbloqueaUsuario?
        Connection con = null;
        Statement st = null;

        int numRegMod = 0;
        String sql = "update usuarios set estadoUsuario='Baja' WHERE dni='" + dni + "'";

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            numRegMod = st.executeUpdate(sql);

            System.out.println(">>> El usuario ahora está de baja.");

            st.close();

        } catch (Exception e) {
            System.out.println("Error al desbloquear el usuario. " + e.getMessage());
        }

        AccesoDatos.cerrarConexion(con);
    }

    public static void modificarEstado(Usuario usuario) {
        String sql = "update usuarios set estadoUsuario = '" + usuario.getEstadoUsuario() + "', fechaBaja = '" + UtilFecha.fechaMySQL(usuario.getFechaBaja()) + "' where Id = " + usuario.getId();

        Connection con = null;
        Statement st = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();

        } catch (Exception e) {
            System.out.println("Error al actualizar el estado del usuario. " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
    }

    public static void modificarContrasenya(Usuario usuario, String contrasenya) {
        String sql = "update usuarios set contrasenya = " + contrasenya + " where Id = " + usuario.getId();

        Connection con = null;
        Statement st = null;

        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
        } catch (Exception e) {
            System.out.println("Error al modificar la contraseña. " + e.getMessage());
        } finally {
            AccesoDatos.cerrarConexion(con);
        }
    }
}
